map.ts ➔ mapping   A
last analyzed

Complexity

Conditions 4

Size

Total Lines 31
Code Lines 26

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 26
dl 0
loc 31
c 0
b 0
f 0
rs 9.256
cc 4
1
import type {
2
  CssModule,
3
} from "./definitions.types";
4
import type {
5
  ClassNamesMapping, ClassNamesMap,
6
} from "./naming.types";
7
import {resolver} from "./core"
8
import type { AnyObject, OmitIndexed } from "./ts-swiss.types";
9
import type { GetProps } from "./react-swiss.types"
10
const {keys: $keys} = Object
11
12
export {
13
  classNamesMap
14
}
15
16
/**
17
 * Set up mapping classnames function
18
 * @example
19
 * ```typescript
20
 * const mapping = classNamesMap(classnames)
21
 * ```
22
 */
23
function classNamesMap<
24
  Source extends CssModule,
25
>(classnames: Source){
26
  const mapper: ClassNamesMapping<Source> = (target, map) => mapping(classnames, target, map)
27
  return mapper
28
}
29
30
function mapping<
31
  Source extends CssModule,
32
  Target extends AnyObject,
33
  Mapping extends ClassNamesMap<OmitIndexed<GetProps<Target>>, Source>
34
>(
35
  source: Source,
36
  _: Target,
37
  map: Mapping
38
): {[M in keyof Mapping]: string} {
39
  // TODO #33 change to for-in https://jsbench.me/prkm3gn4ji
40
  const keys = $keys(map) as (keyof Mapping)[]
41
  // TODO = {...keys} + reassign or delete?
42
  , classnames = {} as {[M in keyof Mapping]: string}
43
44
  for (let i = keys.length; i--;) {
45
    const key = keys[i]
46
    , val = map[key]
47
48
    if (val === undefined)
49
      continue
50
51
    classnames[key] = typeof val === "function"
52
    ? `${val}`
53
    : resolver(source,
54
      //@ts-expect-error #27 TS doesn't understand that ClassNaming is first of all function
55
      val
56
    ).join(" ")
57
  }
58
59
  return classnames
60
}
61